#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

void BMPInsert(int lcd_fd,int bmp_fd)
{
    // 4.读图片文件54字节
    char buffer_1[54] = {0};
    int n = read(bmp_fd,buffer_1,sizeof(buffer_1));
    if(n == 0)
    {
        perror("read bmp error");
    }

    lseek(bmp_fd,54,SEEK_SET);

    // 5.读图片文件800*480*3字节
    char RGBbf [800*480*3] = {0};
    n = read(bmp_fd,RGBbf,sizeof(RGBbf));

    // 6.将读取出来的RGB数据转化成ARGB数据
    int ARGBbf[800*480] = {0};
    for(int i = 0;i < 800 * 480;i++)
    {
        ARGBbf[i] = RGBbf[3*i] << 0 | RGBbf[3*i + 1] << 8 | RGBbf[3*i + 2] << 16 | 0x00 << 24;
    }

    // 7.将数据颠倒
    int bf3[800*480] = {0};
    for(int y = 0;y < 480;y++)
    {
        for(int x = 0 ; x < 800;x++)
        {
            bf3[x + y * 800] = ARGBbf[ x + (479 - y) * 800];
        }
    }

    // 7.将ARGB数据写入开发板
        write(lcd_fd,bf3,sizeof(bf3));
}

int main()
{
    // 显示图片的步骤

    // 1.打开LCD文件
    int lcd_fd = open("/dev/fb0",O_RDWR);
    if(lcd_fd == -1)
    {
        perror("open lcd error");
    }

    // 2.打开图片文件
    int bmp_fd = open("./1.bmp",O_RDWR);
    if(bmp_fd == -1)
    {
        perror("open lcd error");
    }

    // 3.内存映射
        BMPInsert(lcd_fd,bmp_fd);

    // 8.关闭图片文件
    close(bmp_fd);

    // 9.解除内存映射

    // 10.关闭LCD文件
    close(lcd_fd);

    return 0;
}